package notes.java.java8.demo;

import java.util.Comparator;
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

// 方法引用、构造器引用
public class J4_TestMethodRef {
	
	public static void main(String[] args) {
		
		// 1、对象::实例方法名
		Test t = new Test();
		Consumer<String> consumer = t::accept;
		consumer.accept("xxxxxxxxx");
		
		// 2、类：：静态方法
		Supplier<Integer> supplier = Test::get;
		System.out.println(supplier.get());
		// 以前
		Comparator<Integer> compare = (x, y)->Integer.compare(x, y);
		// 现在
		Comparator<Integer> compare1 = Integer::compare;
		
		// 3、类：：实例方法名(是有条件的，必须是第一个参数调用第二个参数，其它情况下不行)
		BiPredicate<String, String> bp = (x, y) -> x.equals(y);
		BiPredicate<String, String> bp2 = String::equals;
		
		// 4、构造器引用
		Supplier<Test> supp = () -> new Test(); // 原先
		Supplier<Test> supp2 = Test::new; // 无参
		Function<Integer, Test> supp3 = (x) -> new Test(x); // 原先
		Function<Integer, Test> supp4 = Test::new; // 有一个参数
		supp4.apply(10);
		BiFunction<Integer, Integer, Test> bf = Test::new; // 两个参数
		bf.apply(10, 20);
		// 数组
		Function<Integer, String[]> sts = String[]::new;
		String[] ss = sts.apply(10); // 创建了一个长度为10的字符串数组
		
		
	}

}

class Test {
	
	// 构造器
	public Test() {
		System.out.println("无参数");
	}
	public Test(int x) {
		System.out.println("有参数");
		System.out.println(x);
	}
	public Test(int x, int y) {
		System.out.println("xy");
	}
	
	// 普通方法 有去无回，有参数无返回值
	public void accept(String str) {
		System.out.println("accept:" + str);
	}
	
	// 静态方法 模拟supplier
	public static int get() {
		return 1024;
	}
	
}
